package io.gitee.loulan_yxq.owner.http;

import io.gitee.loulan_yxq.owner.core.collection.ArrayTool;
import io.gitee.loulan_yxq.owner.core.tool.CharsetTool;
import io.gitee.loulan_yxq.owner.http.enums.CharsetEnum;

import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Optional;

/*********************************************************
 ** http请求工具类
 ** <br><br>
 ** Date: Created in 2021/11/1  14:45
 ** @author loulan
 ** @version 0.0.0
 *********************************************************/
public class HttpTool {

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url 请求的路径地址
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url) {
        return get(url, CharsetTool.defaultCharset());
    }

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param headers  请求头
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap) {
        return get(url, CharsetTool.defaultCharset(), headers, paramMap);
    }

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, Map<String, ? extends Object> paramMap) {
        return get(url, CharsetTool.defaultCharset(), paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, Charset charset) {
        return get(url, charset, null);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, Charset charset, Map<String, ? extends Object> paramMap) {
        return get(url, charset, null, paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, String charset) {
        return get(url, charset, null);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, String charset, Map<String, ? extends Object> paramMap) {
        return get(url, CharsetTool.toCharset(charset), paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param headers  请求头
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String get(String url, Charset charset, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap) {
        return request(url, HttpMethod.GET, charset, headers, paramMap, null);
    }

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url 请求的路径地址
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url) {
        return getStream(url, CharsetTool.defaultCharset());
    }

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param headers  请求头
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap) {
        return getStream(url, CharsetTool.defaultCharset(), headers, paramMap);
    }

    /**
     * get请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, Map<String, ? extends Object> paramMap) {
        return getStream(url, CharsetTool.defaultCharset(), paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, Charset charset) {
        return getStream(url, charset, null);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, Charset charset, Map<String, ? extends Object> paramMap) {
        return getStream(url, charset, null, paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, String charset) {
        return getStream(url, charset, null);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, String charset, Map<String, ? extends Object> paramMap) {
        return getStream(url, CharsetTool.toCharset(charset), paramMap);
    }

    /**
     * get请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param headers  请求头
     * @param paramMap 参数的map集合
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream getStream(String url, Charset charset, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap) {
        return requestStream(url, HttpMethod.GET, charset, headers, paramMap, null);
    }


    /**
     * post请求获取数据（默认编码模式UTF-8）
     *
     * @param url 请求的路径地址
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url) {
        return post(url, (Charset) null, null);
    }

    /**
     * post请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url, String bodyJson) {
        return post(url, (Charset) null, null, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url, Charset charset, String bodyJson) {
        return post(url, charset, null, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url, String charset, String bodyJson) {
        return post(url, CharsetTool.toCharset(charset), bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url, String charset, Map<String, ? extends Object> paramMap, String bodyJson) {
        return post(url, CharsetTool.toCharset(charset), paramMap, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String post(String url, Charset charset, Map<String, ? extends Object> paramMap, String bodyJson) {
        return request(url, HttpMethod.POST, charset, null, paramMap, bodyJson);
    }
    /**
     * post请求获取数据
     * @param url 请求的路径地址
     * @param charset 编码方式
     * @param headerMap 请求头
     * @param paramMap 参数map集合
     * @param bodyJson 请求体
     * @Return: java.lang.String 字符串响应结果
     * @author: yangfeng
     * @date: 2024/8/21 17:33
     **/
    public static String post(String url, Charset charset, Map<String, ? extends Object> headerMap,Map<String, ? extends Object> paramMap, String bodyJson) {
        return request(url, HttpMethod.POST, charset, headerMap, paramMap, bodyJson);
    }

    /**
     * post请求获取数据（默认编码模式UTF-8）
     *
     * @param url 请求的路径地址
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url) {
        return postStream(url, (Charset) null, null);
    }

    /**
     * post请求获取数据（默认编码模式UTF-8）
     *
     * @param url      请求的路径地址
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url, String bodyJson) {
        return postStream(url, (Charset) null, null, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url, Charset charset, String bodyJson) {
        return postStream(url, charset, null, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url     请求的路径地址
     * @param charset 编码方式
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url, String charset, String bodyJson) {
        return postStream(url, CharsetTool.toCharset(charset), bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url, String charset, Map<String, ? extends Object> paramMap, String bodyJson) {
        return postStream(url, CharsetTool.toCharset(charset), paramMap, bodyJson);
    }

    /**
     * post请求获取数据
     *
     * @param url      请求的路径地址
     * @param charset  编码方式
     * @param paramMap 参数的map集合
     * @param bodyJson 请求体
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream postStream(String url, Charset charset, Map<String, ? extends Object> paramMap, String bodyJson) {
        return requestStream(url, HttpMethod.POST, charset, null, paramMap, bodyJson);
    }



    /**
     * 请求获取数据
     *
     * @param url      请求的路径地址
     * @param method   请求方法
     * @param charset  编码方式
     * @param headers  请求头，没有可以为null
     * @param paramMap 参数的集合，没有可以为null
     * @param bodyJson 请求体，没有可以为null
     * @return 字符串响应结果
     * @author :loulan
     */
    public static String request(String url, HttpMethod method, Charset charset, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap, String bodyJson) {
        return HttpRequest.Builder.request(url)
                .method(method)
                .headers(headers)
                .param(paramMap)
                .body(bodyJson)
                .build()
                .execute()
                .charset(charset)
                .body();
    }

    /**
     * 请求获取数据
     *
     * @param url      请求的路径地址
     * @param method   请求方法
     * @param charset  编码方式
     * @param headers  请求头，没有可以为null
     * @param paramMap 参数的集合，没有可以为null
     * @param bodyJson 请求体，没有可以为null
     * @return 字符串响应结果
     * @author :loulan
     */
    public static InputStream requestStream(String url, HttpMethod method, Charset charset, Map<String, ? extends Object> headers, Map<String, ? extends Object> paramMap, String bodyJson) {
        return HttpRequest.Builder.request(url)
                .method(method)
                .headers(headers)
                .param(paramMap)
                .body(bodyJson)
                .build()
                .execute()
                .charset(charset)
                .bodyStrem();
    }

}
